import type { MenuData } from "@/api/menu"
import type { ITreeItemData } from "@/stores/menu"

export type ITreeItemDataWithMenuData = ITreeItemData & {
  meta?: { icon: string; title: string; [key: string]: string }
}

export type IMap = Record<number, ITreeItemData>
// generateTree 可以生成远程数据生成权限树、侧边栏的菜单树
export const generateTree = (list: MenuData[], withMeta: boolean = false) => {
  // 生成内容映射
  const map = list.reduce((memo, current) => {
    const temp = { ...current }
    // withMeta 为true,代表给远程菜单，增加 meta 对象，里面有title 和 icon 属性
    if (withMeta) {
      ;(temp as ITreeItemDataWithMenuData).meta = {
        title: current.title,
        icon: current.icon
      }
    }
    memo[current.id] = temp
    return memo
  }, {} as IMap)
  // 格式化的树
  const tree: ITreeItemDataWithMenuData[] = []
  list.forEach((item) => {
    // 获取父id
    const pid = item.parent_id
    // 映射表中的item,才有children属性的，不能用list的item
    const cur = map[item.id]
    // 如果有父id
    if (pid !== 0 || pid != null) {
      const parent = map[pid]
      // 判断，父是否存在
      if (parent) {
        // 拿到父的子节点
        const children = parent?.children || []
        // 把当前项，加入父children节点
        children.push(cur)
        // 重新赋值
        parent.children = children
        return
      }
    }
    tree.push(cur)
  })
  return tree
}
// 第一种方式，递归
// 第二种方式，内容映射
// 0  -> 内容 parent_id
// 1 -> 内容  parent_id， chidlren[内容 parent_id]
// ....

// 5 -> 内容

// parent_id 为空的 或者 为0

// 第一步，把数据映射为一对象
// 循环，是谁的儿子
